package simulaco.dao;

import gminet.infra.dao.DataAccessObject;
import gminet.infra.db.TransactionException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import simulaco.dto.SimuladoUsuario;
import simulaco.dto.SimuladoUsuarioSituacao;
import simulaco.dto.Usuario;

public class SimuladoUsuarioDAO extends DataAccessObject {

    public static SimuladoUsuario findByPK(int simuladoUsuarioCodigo, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("SELECT A.CD_SIMULADO         CD_SIMULADO       ");
        sbSql.append("     , A.CD_USUARIO          CD_USUARIO        ");
        sbSql.append("     , U.TX_NOME             TX_NOME_USUARIO   ");
        sbSql.append("     , A.TX_INDENTIFICACAO   TX_INDENTIFICACAO ");
        sbSql.append("     , A.TX_DESCRICAO        TX_DESCRICAO      ");
        sbSql.append("     , A.ID_SITUACAO         ID_SITUACAO       ");
        sbSql.append("     , A.TS_CADASTRO         TS_CADASTRO       ");
        sbSql.append("  FROM SIMULADO_USUARIO A ");
        sbSql.append("     , USUARIO          U ");
        sbSql.append(" WHERE A.CD_USUARIO  = U.CD_USUARIO ");
        sbSql.append("   AND A.CD_SIMULADO = ? ");

        SimuladoUsuario simuladoUsuario = null;
        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            setInt(ps, 1, simuladoUsuarioCodigo);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                simuladoUsuario = fromResultSet(rs);
            }
            close(ps);
        } catch (SQLException sqle) {
            throw new TransactionException("SimuladoUsuarioDAO.findByPK (" + sqle.getMessage() + ")");
        }
        return simuladoUsuario;
    }

    public static List<SimuladoUsuario> findAll(Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("SELECT A.CD_SIMULADO         CD_SIMULADO       ");
        sbSql.append("     , A.CD_USUARIO          CD_USUARIO        ");
        sbSql.append("     , U.TX_NOME             TX_NOME_USUARIO   ");
        sbSql.append("     , A.TX_INDENTIFICACAO   TX_INDENTIFICACAO ");
        sbSql.append("     , A.TX_DESCRICAO        TX_DESCRICAO      ");
        sbSql.append("     , A.ID_SITUACAO         ID_SITUACAO       ");
        sbSql.append("     , A.TS_CADASTRO         TS_CADASTRO       ");
        sbSql.append("  FROM SIMULADO_USUARIO A ");
        sbSql.append("     , USUARIO          U ");
        sbSql.append(" WHERE A.CD_USUARIO = U.CD_USUARIO ");
        sbSql.append(" ORDER BY A.CD_SIMULADO ");
        List<SimuladoUsuario> simuladoUsuariosList = new ArrayList<SimuladoUsuario>(100);
        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                SimuladoUsuario simuladoUsuario = fromResultSet(rs);
                simuladoUsuariosList.add(simuladoUsuario);
            }
            close(rs);
        } catch (SQLException sqle) {
            throw new TransactionException("SimuladoUsuarioDAO.findAll (" + sqle.getMessage() + ")");
        }
        return simuladoUsuariosList;
    }

    public static List<SimuladoUsuario> findByUsuario(Usuario usuario, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("SELECT A.CD_SIMULADO         CD_SIMULADO       ");
        sbSql.append("     , A.CD_USUARIO          CD_USUARIO        ");
        sbSql.append("     , U.TX_NOME             TX_NOME_USUARIO   ");
        sbSql.append("     , A.TX_INDENTIFICACAO   TX_INDENTIFICACAO ");
        sbSql.append("     , A.TX_DESCRICAO        TX_DESCRICAO      ");
        sbSql.append("     , A.ID_SITUACAO         ID_SITUACAO       ");
        sbSql.append("     , A.TS_CADASTRO         TS_CADASTRO       ");
        sbSql.append("  FROM SIMULADO_USUARIO A ");
        sbSql.append("     , USUARIO          U ");
        sbSql.append(" WHERE A.CD_USUARIO = U.CD_USUARIO ");
        sbSql.append("   AND A.CD_USUARIO = ? ");
        sbSql.append(" ORDER BY A.TX_INDENTIFICACAO ");
        List<SimuladoUsuario> simuladoUsuariosList = new ArrayList<SimuladoUsuario>(100);
        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            int pos = 1;
            setInt(ps, pos++, usuario.getCodigo());
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                SimuladoUsuario simuladoUsuario = fromResultSet(rs);
                simuladoUsuariosList.add(simuladoUsuario);
            }
            close(rs);
        } catch (SQLException sqle) {
            throw new TransactionException("SimuladoUsuarioDAO.findByUsuario (" + sqle.getMessage() + ")");
        }
        return simuladoUsuariosList;
    }

    public static void insert(SimuladoUsuario simuladoUsuario, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("INSERT INTO SIMULADO_USUARIO ");
        sbSql.append("     ( CD_USUARIO        ");
        sbSql.append("     , CD_SIMULADO       ");
        sbSql.append("     , TX_INDENTIFICACAO ");
        sbSql.append("     , TX_DESCRICAO      ");
        sbSql.append("     , ID_SITUACAO       ");
        sbSql.append("     , TS_CADASTRO       ");
        sbSql.append(") VALUES (?,?,?,?,?,?)");

        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            int pos = 1;
            setInt(ps, pos++, simuladoUsuario.getUsuario().getCodigo());
            setInt(ps, pos++, simuladoUsuario.getCodigo());
            setString(ps, pos++, simuladoUsuario.getIdentificacao());
            setString(ps, pos++, simuladoUsuario.getDescricao());
            setInt(ps, pos++, simuladoUsuario.getSituacao().getCodigo());
            setTimestamp(ps, pos++, simuladoUsuario.getDataCadastro());
            ps.executeUpdate();
            close(ps);
        } catch (SQLException sqle) {
            throw new TransactionException("SimuladoUsuarioDAO.insert (" + sqle.getMessage() + ")");
        }

    }

    public static void update(SimuladoUsuario simuladoUsuario, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("UPDATE SIMULADO_USUARIO      ");
        sbSql.append("   SET TX_INDENTIFICACAO = ? ");
        sbSql.append("     , TX_DESCRICAO      = ? ");
        sbSql.append("     , ID_SITUACAO       = ? ");
        sbSql.append(" WHERE CD_USUARIO        = ? ");
        sbSql.append("   AND CD_SIMULADO       = ? ");

        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            int pos = 1;
            setString(ps, pos++, simuladoUsuario.getIdentificacao());
            setString(ps, pos++, simuladoUsuario.getDescricao());
            setInt(ps, pos++, simuladoUsuario.getSituacao().getCodigo());
            setInt(ps, pos++, simuladoUsuario.getUsuario().getCodigo());
            setInt(ps, pos++, simuladoUsuario.getCodigo());
            ps.executeUpdate();
            close(ps);
        } catch (SQLException sqle) {
            throw new TransactionException("SimuladoUsuarioDAO.update (" + sqle.getMessage() + ")");
        }
    }

    public static void delete(SimuladoUsuario simuladoUsuario, Connection conn) throws TransactionException {

        StringBuffer sbSql = new StringBuffer();
        sbSql.append("DELETE FROM SIMULADO_USUARIO ");
        sbSql.append(" WHERE CD_USUARIO        = ? ");
        sbSql.append("   AND CD_SIMULADO       = ? ");
        try {
            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            int pos = 1;
            setInt(ps, pos++, simuladoUsuario.getUsuario().getCodigo());
            setInt(ps, pos++, simuladoUsuario.getCodigo());
            ps.executeUpdate();
            close(ps);
        } catch (SQLException sqle) {
            throw new TransactionException("SimuladoUsuarioDAO.delete (" + sqle.getMessage() + ")");
        }
    }

    public static int getNextCodigo(int codigoUsuario, Connection conn) throws TransactionException {

        try {
            StringBuffer sbSql = new StringBuffer();
            sbSql.append("SELECT MAX(CD_SIMULADO) AS CD_MAX ");
            sbSql.append("  FROM SIMULADO_USUARIO ");
            sbSql.append(" WHERE CD_USUARIO = ? ");

            PreparedStatement ps = conn.prepareStatement(sbSql.toString());
            setInt(ps, 1, codigoUsuario);
            ResultSet rs = ps.executeQuery();
            int max = 0;
            if (rs.next()) {
                max = rs.getInt("CD_MAX");
            }
            close(rs);
            return max + 1;
        } catch (SQLException sqlEx) {
            throw new TransactionException(sqlEx);
        }
    }

    private static SimuladoUsuario fromResultSet(ResultSet rs) throws SQLException {

        // SIMULADO_USUARIO
        SimuladoUsuario simuladoUsuario = new SimuladoUsuario();
        simuladoUsuario.setCodigo(getInt(rs, "CD_SIMULADO"));
        simuladoUsuario.getUsuario().setCodigo(getInt(rs, "CD_USUARIO"));
        simuladoUsuario.getUsuario().setNome(getString(rs, "TX_NOME_USUARIO"));
        simuladoUsuario.setIdentificacao(getString(rs, "TX_INDENTIFICACAO"));
        simuladoUsuario.setDescricao(getString(rs, "TX_DESCRICAO"));
        simuladoUsuario.setSituacao(SimuladoUsuarioSituacao.getSituacaoById(getByte(rs, "ID_SITUACAO")));
        simuladoUsuario.setDataCadastro(getDateFromTimestamp(rs, "TS_CADASTRO"));
        //
        return simuladoUsuario;
    }

}
